package utils

import (
	"chatOnline/common/message"
	"encoding/binary"
	"encoding/json"
	"errors"
	"fmt"
	"net"
)

// 这里将这些方法关联到结构体中
type Transfer struct {
	// 分析它应该有哪些字段
	Conn net.Conn
	Buf [8096]byte // 定义为数组 使用时当切片 充当传输时的缓冲

}

func(this *Transfer) ReadPkg()(mes message.Message,err error)  {
	//buf := make([]byte,8096)

	fmt.Println("等待读取客户端发送的数据")
	// conn.Read 在conn 没有被关闭的情况下才会被阻塞
	// 如果客户端关闭了 conn 则，不会阻塞
	_,err=this.Conn.Read(this.Buf[0:4])
	if err !=nil{
		//err = errors.New("read pkg header err")
		return
	}
	fmt.Println("读到的buf=",this.Buf[:4])

	// 根据读到的长度 转成 uint32 类型
	var pkgLen uint32
	pkgLen = binary.BigEndian.Uint32(this.Buf[:4])
	// 根据 pkgLen 读取消息内容
	n,err := this.Conn.Read(this.Buf[:pkgLen])
	if n != int(pkgLen) || err != nil {
		err = errors.New("read pkg body err")
		return
	}
	// 把pakLen 反序列化成 message.Message
	err =json.Unmarshal(this.Buf[:pkgLen],&mes)  // 不加& mes 为空
	if err != nil{
		fmt.Println("json.Unmarshal err=",err)
		return
	}
	fmt.Println("读到的内容=",mes)
	return

}


func(this *Transfer)  WritePkg(data []byte) (err error){
	// 先发送一个长度给对方
	var pkgLen uint32
	pkgLen = uint32(len(data))
	var buf [4]byte
	binary.BigEndian.PutUint32(buf[0:4],pkgLen)
	// 发送长度
	n,err  :=this.Conn.Write(buf[0:4])
	if n !=4 || err != nil{
		fmt.Println("conn.Write(btyes) fail =",err)
		return
	}

	// 发送data 本身
	n,err = this.Conn.Write(data)
	if n != int(pkgLen) ||  err != nil{
		fmt.Println("conn.Write(data) fail =",err)
		return
	}

	return
}

